home *** CD-ROM | disk | FTP | other *** search
/ APDL Other Worlds / APDL Other Worlds Collection.iso / SF3000 / Extras / !SFtoSpr / c / SFIconbar < prev    next >
Encoding:
Text File  |  2003-11-06  |  8.3 KB  |  268 lines

  1. /*
  2.  *  SFtoSpr - Star Fighter 3000 graphics converter
  3.  *  Iconbar icon
  4.  *  Copyright (C) 2000  Chris Bazley
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public Licence as published by
  8.  *  the Free Software Foundation; either version 2 of the Licence, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public Licence for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public Licence
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  */
  20.  
  21. /* ANSI library files */
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include <string.h>
  25. #include <stdbool.h>
  26.  
  27. /* RISC OS library files */
  28. #include "kernel.h"
  29. #include "swis.h"
  30. #include "toolbox.h"
  31. #include "event.h"
  32. #include "iconbar.h"
  33.  
  34. /* My library files */
  35. #include "err.h"
  36. #include "msgtrans.h"
  37. #include "Macros.h"
  38. #include "Loader.h"
  39. #include "SprFormats.h"
  40. #include "SFformats.h"
  41. #include "ViewsMenu.h"
  42. #include "nobudge.h"
  43. #include "hourglass.h"
  44.  
  45. /* Local headers */
  46. #include "Main.h"
  47. #include "Utils.h"
  48. #include "SaveSprites.h"
  49. #include "SavePlanets.h"
  50. #include "SaveMapTiles.h"
  51. #include "SaveDir.h"
  52. #include "SFIconbar.h"
  53. #include "SFgfxconv.h"
  54.  
  55. static ObjectId Iconbar_id = NULL_ObjectId, oldbox = NULL_ObjectId;
  56.  
  57. /* ----------------------------------------------------------------------- */
  58. /*                       Function prototypes                               */
  59.  
  60. static ToolboxEventHandler _Iconbar_clickhandler;
  61.  
  62. static LoaderFinishedHandler planetfile_loadedhandler, tilefile_loadedhandler, spritefile_loadedhandler, dir_loadedhandler;
  63. static void check_dup_savebox(char *file_path, bool data_saved);
  64. static void open_new_savebox(ObjectId savebox);
  65.  
  66. /* ----------------------------------------------------------------------- */
  67. /*                         Public functions                                */
  68.  
  69. void Iconbar_initialise(ObjectId id)
  70. {
  71.   Iconbar_id = id;
  72.  
  73.   /* Listen for SELECT clicks */
  74.   EF(event_register_toolbox_handler(id, Iconbar_Clicked, _Iconbar_clickhandler, NULL));
  75.  
  76.   /* Register listeners for files dropped on iconbar icon */
  77.   EF(loader_register_listener(LISTENER_SPRITEAREAS, FILETYPE_SPRITE, id, NULL, load_sprites, spritefile_loadedhandler, NULL));
  78.   EF(loader_register_listener(0, FILETYPE_PLANETS, id, NULL, load_compressed, planetfile_loadedhandler, NULL));
  79.   EF(loader_register_listener(0, FILETYPE_MAPTILES, id, NULL, load_compressed, tilefile_loadedhandler, NULL));
  80.   EF(loader_register_listener(LISTENER_FILEONLY, FILETYPE_DIR, id, NULL, NULL, dir_loadedhandler, NULL));
  81.   EF(loader_register_listener(LISTENER_FILEONLY, FILETYPE_APP, id, NULL, NULL, dir_loadedhandler, NULL));
  82. }
  83.  
  84. /* ----------------------------------------------------------------------- */
  85. /*                         Private functions                               */
  86.  
  87. static int _Iconbar_clickhandler(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
  88. {  
  89.   /* Bring all open windows to front */
  90.   RE(ViewsMenu_showall());
  91.   
  92.   return 1; /* claim event */
  93. }
  94.  
  95. /* ----------------------------------------------------------------------- */
  96.  
  97. static void planetfile_loadedhandler(char *file_path, bool data_saved, flex_ptr buffer, int filetype, void *handle)
  98. {
  99.   check_dup_savebox(file_path, data_saved);
  100.   
  101.   /* Convert planets > sprites */
  102.   spriteareaheader *sprite_area;
  103.   bool success = planets_to_sprites((SF_PlanetsSetHdr **)buffer, &sprite_area);
  104.   flex_free(buffer);
  105.   if(success == false)
  106.     return;
  107.  
  108.   /* Open sprites savebox */
  109.   ObjectId newbox = SaveSprites_create(file_path, data_saved, &sprite_area, NULL);
  110.   if(newbox == NULL_ObjectId) {
  111.     flex_free((flex_ptr)&sprite_area);
  112.     return;
  113.   }
  114.  
  115.   open_new_savebox(newbox);  
  116. }
  117.  
  118. /* ----------------------------------------------------------------------- */
  119.  
  120. static void tilefile_loadedhandler(char *file_path, bool data_saved, flex_ptr buffer, int filetype, void *handle)
  121. {
  122.   check_dup_savebox(file_path, data_saved);
  123.  
  124.   /* Convert tiles > sprites */
  125.   spriteareaheader *sprite_area;
  126.   if(tiles_to_sprites((SF_MapTilesSetHdr **)buffer, &sprite_area) == false) {
  127.     flex_free(buffer);
  128.     return;
  129.   }
  130.  
  131.   /* Open sprites savebox */
  132.   ObjectId newbox = SaveSprites_create(file_path, data_saved, &sprite_area, (SF_MapTilesSetHdr **)buffer);
  133.   flex_free(buffer);
  134.   if(newbox == NULL_ObjectId) {
  135.     flex_free((flex_ptr)&sprite_area);
  136.     return;
  137.   }
  138.  
  139.   open_new_savebox(newbox);  
  140. }
  141.  
  142. /* ----------------------------------------------------------------------- */
  143.  
  144. static void spritefile_loadedhandler(char *file_path, bool data_saved, flex_ptr buffer, int filetype, void *handle)
  145. {
  146.   bool found_pla, found_tile;
  147.   ObjectId newbox;
  148.  
  149.   /* Verify sprite area we will be generating output from */
  150.   if(verify_spriteareas) {
  151.     nobudge_register(256);
  152.     _kernel_oserror *errptr = _swix(OS_SpriteOp, _INR(0,1), SPRITEOP_VERIFY_AREA + SPRITEOP_USERAREA_SPRNAME, *buffer);
  153.     nobudge_deregister();
  154.     if(errptr != NULL) {
  155.       err_report(errptr->errnum, errptr->errmess);
  156.       flex_free(buffer); /* discard sprites */
  157.       return;
  158.     }
  159.   }
  160.  
  161.   /* Try to guess whether to convert sprites to planets or tiles */
  162.   found_tile = contains_valid_tiles((spriteareaheader **)buffer);
  163.   found_pla = contains_valid_planets((spriteareaheader **)buffer);
  164.   if(found_pla && found_tile) {
  165.     flex_free(buffer); /* discard sprites */
  166.     M_RET("AutoDouble");
  167.   }
  168.   if(!found_pla && !found_tile) {
  169.     flex_free(buffer); /* discard sprites */
  170.     M_RET("AutoNoMatch");
  171.   }
  172.  
  173.   check_dup_savebox(file_path, data_saved);
  174.   
  175.   if(found_pla) {
  176.     /* Convert sprites > planets */
  177.     SF_PlanetsSetHdr *planets;
  178.     bool success = sprites_to_planets((spriteareaheader **)buffer, &planets, false);
  179.     flex_free(buffer);
  180.     if(success == false)
  181.       return;
  182.  
  183.     /* Create planets file savebox */
  184.     newbox = SavePlanets_create(file_path, data_saved, &planets);
  185.     if(newbox == NULL_ObjectId) {
  186.       flex_free((flex_ptr)&planets);
  187.       return;
  188.     }
  189.  
  190.   } else {
  191.     /* Convert sprites > tiles */
  192.     SF_MapTilesSetHdr *tiles;
  193.     bool success = sprites_to_tiles((spriteareaheader **)buffer, &tiles, false);
  194.     flex_free(buffer);
  195.     if(success == false)
  196.       return;
  197.  
  198.     /* Load accompanying animations textfile, if any */
  199.     if(data_saved) {
  200. #ifndef OLD_SCL_STUBS
  201.       char anifilename[strlen(file_path)+4+1];
  202. #else
  203.       char *anifilename = malloc(strlen(file_path)+4+1);
  204.       if(anifilename == NULL)
  205.         MG("NoMem");
  206.       else {
  207. #endif
  208.         sprintf(anifilename, "%s/ani", file_path);
  209.         _kernel_oserror *errptr = load_animsfilepath(anifilename, &tiles, false);
  210.         if(errptr != NULL)
  211.           err_report(errptr->errnum, errptr->errmess);
  212. #ifdef OLD_SCL_STUBS
  213.       }
  214.       free(anifilename);
  215. #endif
  216.     }
  217.  
  218.     /* Create tiles file savebox */
  219.     newbox = SaveMapTiles_create(file_path, data_saved, &tiles);
  220.     if(newbox == NULL_ObjectId) {
  221.       flex_free((flex_ptr)&tiles);
  222.       return;
  223.     }
  224.   }
  225.   open_new_savebox(newbox);  
  226. }
  227.  
  228. /* ----------------------------------------------------------------------- */
  229.  
  230. static void dir_loadedhandler(char *file_path, bool data_saved, flex_ptr buffer, int filetype, void *handle)
  231. {
  232.   check_dup_savebox(file_path, data_saved);
  233.   
  234.   /* Create an output dialogue for a new batch operation */
  235.   ObjectId newbox = SaveDir_create(file_path);
  236.  
  237.   if(newbox != NULL_ObjectId)
  238.     open_new_savebox(newbox);  
  239. }
  240.  
  241. /* ----------------------------------------------------------------------- */
  242.  
  243. static void check_dup_savebox(char *file_path, bool data_saved)
  244. {
  245.   /* Check for existing dialogues */
  246.   if(!multi_saveboxes)
  247.     oldbox = last_savebox;
  248.   else {
  249.     if(data_saved)
  250.       oldbox = ViewsMenu_findview(file_path);
  251.     else
  252.       oldbox = NULL_ObjectId;
  253.   }
  254. }
  255.  
  256. /* ----------------------------------------------------------------------- */
  257.  
  258. static void open_new_savebox(ObjectId savebox)
  259. {
  260.   /* Open savebox */
  261.   RE(open_above_iconbar(0, savebox, Iconbar_id, NULL_ComponentId));
  262.   last_savebox = savebox;
  263.  
  264.   /* Remove any old savebox (same filepath or only one at a time allowed) */
  265.   if(oldbox != NULL_ObjectId)
  266.     RE(toolbox_hide_object(0, oldbox)); /* will delete self when ready */
  267. }
  268.